home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / LANG / PROLOG / HUMBOLT / HUMBOLTS / _files / _humboltsr / MISC._c < prev    next >
Text File  |  1990-06-10  |  5KB  |  186 lines

  1. /***************************************************
  2. ****************************************************
  3. **                                                **
  4. **  HU-Prolog     Portable Interpreter System     **
  5. **                                                **
  6. **  Release 1.62   January  1990                  **
  7. **                                                **
  8. **  Authors:      C.Horn, M.Dziadzka, M.Horn      **
  9. **                                                **
  10. **  (C) 1989      Humboldt-University             **
  11. **                Department of Mathematics       **
  12. **                GDR 1086 Berlin, P.O.Box 1297   **
  13. **                                                **
  14. ****************************************************
  15. ***************************************************/
  16.  
  17. #include "systems.h"
  18. #include "atoms.h"
  19. #include "types.h"
  20. #include "errors.h"
  21. #include "manager.h"
  22.  
  23. IMPORT TERM A0,A1,A2;            /* from evalpreds.c     */
  24. IMPORT int BCT;
  25. IMPORT boolean INTRES(); /* from unify.c         */
  26. #if LONGARITH
  27. IMPORT boolean LONGRES();        /* from unify.c         */
  28. #endif
  29. IMPORT long TIMER();             /* from systems.c       */
  30. #if !RISCOS
  31. IMPORT struct tm *localtime();   /* from clib            */
  32. IMPORT long time();              /* from clib            */
  33. #endif
  34. IMPORT boolean UNIFY();          /* from unify.c         */
  35. IMPORT ENV E;
  36. IMPORT void SYSTEMERROR();
  37. /*
  38. EXPORT boolean DOTIME(),DOTIMER();
  39. EXPORT boolean DOANCESTORS()
  40. */
  41.  
  42. /**************************************************/
  43. /*               date & time                      */
  44. /**************************************************/
  45.  
  46. #if !CPM 
  47.  
  48. #include <time.h>
  49.  
  50. #if !RISCOS
  51. LOCAL long LTIME;
  52. LOCAL struct tm *TIMEREC;
  53. #else
  54. LOCAL time_t LTIME;
  55. LOCAL struct tm *TIMEREC;
  56. #endif
  57.  
  58. GLOBAL boolean DOTIME(ATOM A)
  59.  (void)time(<IME);
  60.  TIMEREC=localtime(<IME);
  61.  switch(A)
  62.  {
  63.      case TIME_3:
  64.          return INTRES(A0,TIMEREC->tm_hour) && 
  65.          INTRES(A1,TIMEREC->tm_min) && 
  66.          INTRES(A2,TIMEREC->tm_sec); 
  67.      case DATE_3:
  68.          return  INTRES(A0,TIMEREC->tm_year) &&
  69.          INTRES(A1,TIMEREC->tm_mon + 1) &&
  70.          INTRES(A2,TIMEREC->tm_mday);
  71.     case WEEKDAY_1:
  72.          return INTRES(A0,(TIMEREC->tm_wday?TIMEREC->tm_wday:7));
  73.     default:
  74.          SYSTEMERROR("misc.c/DOTIME");
  75.  }
  76. #if lint
  77.  return false;
  78. #endif
  79. }
  80.  
  81. #endif
  82.  
  83. GLOBAL boolean DOTIMER(void)
  84. { static long STARTTIME,CURRTIME;
  85.          CURRTIME=TIMER();
  86.          if(name(A0)==INTT)
  87.            { STARTTIME=CURRTIME-(long)ival(A0); return true; }
  88.          else
  89. #if LONGARITH
  90.          if(name(A0)==LONGT)
  91.            { STARTTIME=CURRTIME-longval(A0); return true; }
  92.          else return LONGRES(A0,CURRTIME-STARTTIME);
  93. #endif
  94. #if ! LONGARITH
  95.          return INTRES(A0,(int)(CURRTIME-STARTTIME));
  96. #endif
  97. }
  98.  
  99.  
  100. GLOBAL boolean DOANCESTORS(void)
  101. {
  102.     TERM T,TT,C;
  103.     ENV CE;
  104.  
  105.     TT=mkfunc(CONS_2,mk2sons(UNBOUNDT,nil_term,NIL_0,nil_term)); T=TT;
  106.     for(CE=E;CE;CE=env(CE))
  107.         if((C=call(CE)) && name(C)!=SEMI_2 && name(C)!=COMMA_2)
  108.         {   T=son(T); 
  109.             (void)UNIFY(1,T,C,BE,base(env(CE)),MAXDEPTH);
  110.             next_br(T);
  111.             name(T)=CONS_2;
  112.             son(T)=mk2sons(UNBOUNDT,nil_term,NIL_0,nil_term);
  113.         }
  114.     name(T)=NIL_0; son(T)=nil_term;
  115.     return UNI(A0,TT);
  116. }
  117.  
  118.  
  119.  
  120. GLOBAL boolean islist(register TERM T, boolean ascii)
  121. {
  122.     int counter=0;
  123.     deref(T);
  124.     while(name(T)==CONS_2)
  125.     {
  126.         if(ascii)
  127.       {
  128.             register TERM TT;
  129.             TT=arg1(T);
  130.             if(name(TT) !=INTT) return false;
  131.             if(ival(TT) < 0 || ival(TT) > 255) return false;
  132.         }
  133.         T=arg2(T);
  134.         if(counter++ > MAXTERMS) return false; /* zyklic term */
  135.     }
  136.     return (name(T)==NIL_0);
  137. }
  138.  
  139. GLOBAL boolean DOMEMBER(void)
  140. {
  141.   register int I=0;
  142.   register TERM T,TT;
  143.   register ATOM A;
  144.   T=A1; A=name(A0);
  145.   while (I<BCT && name(T)==CONS_2) { T=br(son(T)); deref(T); I++; }
  146.   if (I!=BCT) ARGERROR();
  147.   while (name(T)==CONS_2)
  148.   { BCT++;
  149.     TT=son(T); deref(TT);
  150.     if (name(TT)==UNBOUNDT) return UNI(son(T),A0);
  151.     if (A==UNBOUNDT || name(TT)==A) if (UNI(son(T),A0)) return true;
  152.     if (BCT>100000) return false; /* probably cyclic term */
  153.     T=br(son(T));
  154.     deref(T);
  155.   }
  156.   return false;
  157. }
  158.  
  159. static TERM TAIL;
  160.  
  161. static TERM append(register TERM X)
  162. { register TERM Z;
  163.   register TERM Y;
  164.   if (name(X)==NIL_0) return son(TAIL);
  165.   if (name(X)!=CONS_2) ARGERROR();
  166.   {  X=son(X); Y=br(X);
  167.      deref(X); deref(Y);
  168.      Z=mk2sons(name(X),son(X),CONS_2,append(Y));
  169.      return Z;
  170.   }
  171. }
  172.  
  173. GLOBAL boolean DOAPPEND(void)
  174. {
  175.   TERM X;
  176.   if (name(A0)==NIL_0) return UNI(A1,A2);
  177.   if (name(A1)==NIL_0) return UNI(A0,A2);
  178.   X=mkfreevar(); TAIL=mkfreevar();
  179.   UNI(X,A0); UNI(TAIL,A1);
  180.   deref(X);
  181.   return UNI(mkfunc(CONS_2,append(X)),A2);
  182. }
  183.  
  184.  
  185.